// 7、tuple 元组
// 元组（Tuple）是一种特殊的数组类型，可以固定数量的元素，并且
// 每个元素的类型是已知的且可以不同，元组用于精确描述一组值的类
// 型，?表示可选元素
let data: [string, number]
let arrdata: [string, boolean?]
data = ['name', 666]
arrdata = ['name']

let arrTest: [number, ...string[]]  //表示后面可以写任意个字符串数据元素
arrTest = [1, 'a', 'b', 'c']


// 8、enum   // enum是一个关键词，和es6的class类一样
// 枚举(enum)可以定义一组命名常亮，他能增强代码的可读性，也能让代码更好维护
// 案例：JS常规写法
function walkJs(data:string) {
    if (data == 'up') {
        console.log('向【上】走了');

    } else if (data == 'down') {
        console.log('向【下】走了');

    } else if (data == 'left') {
        console.log('向【左】走了');

    } else if (data == 'right') {
        console.log('向【右】走了');

    } else {
        console.log('你往哪走了？？？');

    }
}
walkJs('up')
walkJs('left')
walkJs('right')
walkJs('hskjhks')
// 这种写法弊端：
//    1、如果逻辑较多会导致维护性较差，假人括号里判断的是数字1、2或者其他的字符等等，逻辑不清晰
//    2、如果传入的参数写错了，会没有提示报警，那么就会执行错误的逻辑。

//案例  TS写法 
enum Direction {
    Up,
    Down,
    Left,
    Right
}
function walkTs(data:Direction) {
    if (data == Direction.Up) {
        console.log('向【上】走了');

    } else if (data == Direction.Down) {
        console.log('向【下】走了');

    } else if (data == Direction.Left) {
        console.log('向【左】走了');

    } else if (data == Direction.Right) {
        console.log('向【右】走了');

    }else {
        console.log('你往哪走了？？？');

    }
}

// walkTs('ass')  //报错
walkTs(Direction.Down)
walkTs(Direction.Left)
walkTs(Direction.Down)

// 详解：
// 一、数字枚举
// 数字枚举是一种最常见的枚举类型，其成员的值会自动递增，且数字枚
// 举还具备反向映射的特点，在下面代码的打印中，不难发现:可以通过
// 值来获取对应的枚举成员名称
enum TestEnum {
    Up,
    Down,
    Left,
    Right
    // Up = 111,  数字枚举的数字可以自定义
    // Down = 222,
    // Left = 333,
    // Right = 444
}

console.log(TestEnum.Up)  //打印的是：0
//1、Up,Down,Left,Right这些可不是对象的简写形式
console.log('TestEnum',TestEnum); 
// 打印的是 {0:'Up',1:'Down',2:'Left',3:'Right',Up:0,Down：1,Left:2,Right:3}
// up:0,Down：1,Left:2,Right:3  数字枚举的递增性
// 0:'Up',1:'Down',2:'Left',3:'Right'  反向映射

// 2、enum定义的变量是只读的属性
// TestEnum.Up = 999  //报错

//二、 字符串枚举
// 枚举成员的值是字符串
enum StrEnum {
    up='up',
    down='down',
    left='left',
    right='right',
}
// 字符串枚举会丢失其反向映射的值
console.log('StrEnum',StrEnum);   //打印的是：{up: 'up', down: 'down', left: 'left', right: 'right'}

// 三、常量枚举
const enum ConstEnum {
    Up,
    Down,
    Left,
    Right
}
console.log('ConstEnum',ConstEnum.Up);
// 从编程的角度是没啥区别的，最主要的差别是在index.js文件里不会显示ConstEnum这个方法了，性能提升

